package com.atguigu.uitl;

import com.atguigu.bean.TableProcess;
import com.google.common.base.CaseFormat;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author hjy
 * @create 2023/3/9 18:49
 */
public class JdbcUtil {
    //泛型方法，可以适配所有的返回值类型
    //这里要查询数据，而查询出来的结果只有四种情况：单行单列   单行多列
    //                                         多行单列   多行多列
    //所以返回值类型选择List<T>
    //由于是通用的方法，无法确定这个方法会有什么类型的异常，所以要将类型抛出去处理
    public static <T> List<T> getJDBC (Connection connection,String sql,Class<T> clz,Boolean isUnderScoreToCamel) throws Exception {
        //建立返回值的对象
        ArrayList<T> tList = new ArrayList<>();
        // 预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //拿到查询的数据
        ResultSet resultSet = preparedStatement.executeQuery();
        //获取元数据信息，才能方便获取列名和对象
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();
        //按行读取
        while (resultSet.next()) {
            //创建t对象
            T t = clz.newInstance();
            for (int i = 0; i < columnCount; i++) {
                //todo 这里一定要注意！使用的是ColumnName
                String columnName = metaData.getColumnName(i + 1);
                Object value = resultSet.getObject(columnName);
                if (isUnderScoreToCamel){
                    columnName=CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL,columnName.toLowerCase());
                }
                BeanUtils.setProperty(t,columnName,value);
            }
            tList.add(t);
        }
        return tList;
    }
    //测验是否能读到数据
    public static void main(String[] args) throws Exception {
        //拿到一个连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://hadoop102:3306/gmall_config?" +
                "user=root&password=123456&useUnicode=true&" +
                "characterEncoding=utf8&serverTimeZone=Asia/Shanghai&useSSL=false");
        List<TableProcess> tableProcessList = getJDBC(conn, "select * from table_process", TableProcess.class, true);
        for (TableProcess tableProcess : tableProcessList) {
            System.out.println(tableProcess);
        }
    }
}
